/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package tabuvpr.main;

import tabuvpr.model.Move;
import tabuvpr.model.Grafo;
import tabuvpr.model.Heuristica;
import tabuvpr.model.Solucion;
import tabuvpr.model.Evento;
import java.util.ArrayList;
import java.util.Set;
import tabuvpr.model.Node;
import tabuvpr.model.Reloj;

/**
 *
 * @author Shadow
 */
public class TABUVPR {

    /**
     * @param args the command line arguments
     */
    private static Solucion mejorSolucion = null;
    private static Heuristica heuristica = new Heuristica();
    private static long maxExecTime = 800; //En milisegundos
    public static void main(String[] args) throws Exception{
        Reloj.init();
        Reloj.tick();
        Tabuparameters.setParameters();
        Dispatcher.leerEventos();
        ArrayList<Node> nodos = Dispatcher.siguientesPedidos(); //Para el caso inicial (sin considerar re-ruteo) seran todos los eventos
        //Los eventos puede ser nuevos pedidos o incidencias, para este primer algoritmos se consideraran solo pedidos
        Solucion bestSol = hallarSolucion(nodos);
        
    }

    private static double funcObj(Move move) {
        throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
    }

    private static Solucion hallarSolucion(ArrayList<Node> nodos) {
        Solucion s0 = heuristica.obtenerSolucionInicial(nodos);
        Tabuparameters.vSol.update(Tabuparameters.vSol.getGraphics());
        mejorSolucion = s0;
        TabuList.Init();
        int i = 0;
        //Se tomará el tiempo de ejecucion como criterio
        long startTime;
        long execTime = startTime = System.currentTimeMillis();
        while (execTime - startTime <= maxExecTime) {
            double minFuncObj = Double.MAX_VALUE;
            Solucion bestMove = null;
            while (true) {
                bestMove = heuristica.getImprovement(s0);
                
                if ( <= minFuncObj) {
                    mejorSolucion = move;
                    minFuncObj = tmpFuncObj;
                    break;
                }
            }
            /*
            if (moveFound && bestMove!=null) {
                Solucion s = heuristica.apply(bestMove);
                TabuList.setTabu(bestMove.getSourceNode(),
                              bestMove.getTargetPath());
                if (s.getCost() < mejorSolucion.getCost()) {
                    setMejorSolucion(s);
                }
            }
            TabuList.step();
            i++;*/
        }
        return mejorSolucion;
    }

    private static void setMejorSolucion(Solucion s) {
        throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
    }
}
